
package com.hhl.demo;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ConcurrentLinkedDeque;
import java.util.concurrent.TimeUnit;


/**
 * 1.在并发队列上JDK提供了两套实现，一个是以ConcurrentLinkedQueue为代表的高性能队
 * 列，一个是以BlockingQueue接口为代表的阻塞队列，无论哪种都继承自Queue。
 * 
 * 2.ConcurrentLinkedQueue : 是一个适用于高并发场景下的队列，通过无锁的方式，实现
	了高并发状态下的高性能，通常ConcurrentLinkedQueue性能好于BlockingQueue.它
	是一个基于链接节点的无界线程安全队列。该队列的元素遵循先进先出的原则。头是最先
	加入的，尾是最近加入的，该队列不允许null元素。
	ConcurrentLinkedQueue重要方法:
	add 和offer() 都是加入元素的方法(在ConcurrentLinkedQueue中这俩个方法没有任何区别)
	poll() 和peek() 都是取头元素节点，区别在于前者会删除元素，后者不会。
	
	3.BlockingQueue(可以阻塞，有界)
		阻塞队列（BlockingQueue）是一个支持两个附加操作的队列。这两个附加的操作是：
		在队列为空时，获取元素的线程会等待队列变为非空。
		当队列满时，存储元素的线程会等待队列可用。 
		阻塞队列常用于生产者和消费者的场景，生产者是往队列里添加元素的线程，消费者是从队列里拿元素的线程。
		阻塞队列就是生产者存放元素的容器，而消费者也只从容器里拿元素。
 */
public class Test005 {

	public static void main(String[] args) throws InterruptedException {
		// 无界
		ConcurrentLinkedDeque concurrentLinkedDeque = new ConcurrentLinkedDeque();
		concurrentLinkedDeque.offer("张三");
		concurrentLinkedDeque.offer("李四");
		// System.out.println(concurrentLinkedDeque.size());
		// System.out.println(concurrentLinkedDeque.poll());
		// System.out.println(concurrentLinkedDeque.peek());
		// System.out.println(concurrentLinkedDeque.size());
		ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue(3);
		arrayBlockingQueue.add("张三");
		arrayBlockingQueue.add("李四");
		arrayBlockingQueue.add("王武");
		// 可以阻塞的队列
		boolean offer = arrayBlockingQueue.offer("王麻衣子", 2, TimeUnit.SECONDS);
		System.out.println(arrayBlockingQueue.size() + "---" + offer);
		System.out.println(arrayBlockingQueue.poll());
		System.out.println(arrayBlockingQueue.poll());
		System.out.println(arrayBlockingQueue.poll());
		System.out.println(arrayBlockingQueue.poll());
	}

}
